package com.baike.job;

import com.baike.entity.TbStudent;
import com.baike.mapper.TbStudentMapper;
import org.springframework.beans.factory.annotation.Configurable;
import org.springframework.data.redis.core.DefaultTypedTuple;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.scheduling.annotation.EnableScheduling;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;

import javax.annotation.Resource;
import java.util.List;
import java.util.Set;

//定时器工作组件,//千人千面更新业务
@Component
@Configurable
@EnableScheduling
public class RecommendQuartzJob{

    @Resource
    private RedisTemplate redisTemplate;
    @Resource
    private TbStudentMapper studentMapper;


    //定时任务,每30分钟刷新redis的标签
//    "0 0 12 * * ?" 每天中午12点触发
//    "* * * * * * " 一秒一发
//    0 0/30 * * * ? 每隔30分钟
//    0 */1 * * * ? 一分钟一次
//    0 0 0/1 * * ? 一小时一次
    @Scheduled(cron = "0 0 0/1 * * ? ")
    public void reportCurrentByCron(){
        //获取所有用户
        List<TbStudent> students = studentMapper.selectList(null);

        for (TbStudent student : students) {
            //判断是否是新用户
            if (redisTemplate.hasKey(student.getStudentId()+"-num")){
                //获取用户获取访问时间最近的三个标签,倒序排序获取指定区间的值和分数
                Set<DefaultTypedTuple<Integer>> labelTime = redisTemplate.boundZSetOps(student.getStudentId()+"-time").reverseRangeWithScores(0,2);
                for (DefaultTypedTuple<Integer> recordTime : labelTime) {
                    //查看这三个标签访问量是否大于三
                    Double score = redisTemplate.boundZSetOps(student.getStudentId() + "-num").score(recordTime.getValue());
                    if (score < 3){
                        //删除浏览量小于三的标签（目的是排除用户一不小心点击到的情况）
                        redisTemplate.boundZSetOps(student.getStudentId()+"-num").remove(recordTime.getValue());
                        redisTemplate.boundZSetOps(student.getStudentId()+"-time").remove(recordTime.getValue());
                    }
                }
                //获取浏览量排名前四的标签
                Set<DefaultTypedTuple<Integer>> labelNum = redisTemplate.boundZSetOps(student.getStudentId()+"-num").reverseRangeWithScores(0, 3);
                //添加进用户定向推荐缓存中
                addRecommendRedis(labelNum,student.getStudentId());
                //再次获取最近访问的三个标签
                Set<DefaultTypedTuple<Integer>> recentlyLabel = redisTemplate.boundZSetOps(student.getStudentId()+"-time").reverseRangeWithScores(0,2);
                //添加进用户定向推荐缓存中
                addRecommendRedis(recentlyLabel,student.getStudentId());
            }
            //如果是新用户,redis中没数据则不做处理;
        }
    }

    //添加方法提取
    public void addRecommendRedis(Set<DefaultTypedTuple<Integer>> labels,Long studentId){
        for (DefaultTypedTuple<Integer> label : labels) {
            //判断是否已经创建定向的推荐
            if (redisTemplate.hasKey(studentId) && redisTemplate.boundZSetOps(studentId).rank(label.getValue()) != null){
                //如果有,分数+2
                redisTemplate.boundZSetOps(studentId).incrementScore(label.getValue(),2);
            }else {
                //没有,就创建,直接+3
                redisTemplate.boundZSetOps(studentId).add(label.getValue(),3);
            }
        }
    }


}
